iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0

Keyword: KMM shared module, Expect/Actual


今天我們來看看範例專案內容,先切換到Project顯示,展示整個專案的內容.

KMM可以跨平台運行的魔法,就藏在shared的模組中.

https://github.com/officeyuli/itHome2021/raw/main/day7/project%20structure.jpg

shared正如其名,是負責共用的部分的區塊,而其中的commonMain資料夾更是用來存放雙平台均通用的部分,讓我們點開commonMain的資料夾

https://github.com/officeyuli/itHome2021/raw/main/day7/commonMain.jpg

可以看到有兩個物件,Greeting與Platform.先打開Greeting物件,可以看到下面的程式碼.

class Greeting {
    fun greeting(): String {
        return "Hello, ${Platform().platform}!"
    }
}

內容很簡單,就有一個方法,內容是呼叫Platform並且回傳一串字串.我們再點開Platform看看其中的內容.

expect class Platform() {
    val platform: String
}

也是很簡單的,但是有一個不大熟悉的關鍵字出現"expect",並且旁邊還有一個特別的符號在.像是一個”A“

點了下去會有兩個選項可以選擇,還都叫Platform,只是其中一個看路徑...好像在iosMain內?隨便選一個會發生跳轉,這次符號變成了一個"E"

Expect與Actual

眼尖的人剛剛應該已經注意到在class前面已經分別有Expect與Actual的關鍵字了.

原來,這個是KMM提供給各平台分別實做的關鍵字.

由Expect關鍵字定義這個物件提供怎樣的屬性與方法.

以這個範例來說就是提供一個字串

而兩個以Actual標記的物件,則是各平台對於這個Expect的實作.

可以看到Android的是

actual class Platform actual constructor() {
    actual val platform: String = "Android ${android.os.Build.VERSION.SDK_INT}"
}

並且放在androidMain的package下

而iOS則是

actual class Platform actual constructor() {
    actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
}

放在iosMain的package下

而最後上層的畫面,能直接使用的,只有sharedMain的內容.

可以看看androidApp內的MainActivity,是負責顯示的VIew層,在KMM的架構中,顯示的View層是由各平台自行實作的.

Android當然是直接使用Kotlin撰寫

...
import com.officeyuli.myapplicationkmm.Greeting
...
fun greet(): String {
    return Greeting().greeting()
}
...

而iOS的View層,則是由iOS的原生語言Swift撰寫

...
import shared
...
struct ContentView: View {
	let greet = Greeting().greeting()

	var body: some View {
		Text(greet)
	}
}

暸解了KMM如何共用後,明天我們開始修改這個專案,讓內容更加豐富


上一篇
Day 6:Hello....iOS world! 建立第一個KMM專案(iOS)
下一篇
Day 8:工欲善其事,必先利其器,準備好Gradle依賴
系列文
挑戰 Kotlin Multiplatform Mobile 跨平台開發,透過共同的Kotlin模組同時打造iOS與Android應用!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言